package com.example.exercises;

import java.util.HashMap;
import java.util.Map;

/**
 * 781. 森林中的兔子
 * 森林中，每个兔子都有颜色。其中一些兔子（可能是全部）告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
 * <p>
 * 返回森林中兔子的最少数量。
 * <p>
 * 示例:
 * 输入: answers = [1, 1, 2]
 * 输出: 5
 * 解释:
 * 两只回答了 "1" 的兔子可能有相同的颜色，设为红色。
 * 之后回答了 "2" 的兔子不会是红色，否则他们的回答会相互矛盾。
 * 设回答了 "2" 的兔子为蓝色。
 * 此外，森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
 * 因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。
 * <p>
 * 输入: answers = [10, 10, 10]
 * 输出: 11
 * <p>
 * 输入: answers = []
 * 输出: 0
 * <p>
 * 思路：设置一个一个计数器。
 * 判断重复类型的题，map是非常好的思路
 * 首先遍历数组，如果是0的话，说明没有和它同颜色的，直接+1
 * 如果不为零的话，说明兔子数量最少为n+1，且说n的兔子不超过n+1，否则需要另起炉灶
 * 如果map中 没有 这个key，则将当前遍历值置入key，value填1，总数+1
 * 如果有这个key，则把value+1，总数不变。
 * 然后判断value，如果大于了n+1，则另起炉灶，将value重置为1，且总数加1
 */
public class RabbitsinForest {
    public int numRabbits(int[] answers) {
        Map<Integer, Integer> map = new HashMap<>();
        int sum = 0;
        for (int i : answers) {
            if (i == 0) {
                sum += 1;
                continue;
            } else {
                if (!map.containsKey(i)) {
                    sum += i + 1;
                    map.put(i, 1);
                } else {
                    map.put(i, map.get(i) + 1);
                }
                if (map.get(i) > i + 1) {
                    sum += i + 1;
                    map.put(i, 1);
                }
            }
        }
        return sum;
    }
}
